package etm.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import upc.condominio.modelo.Mensaje;
import upc.condominio.modelo.PagoCuota;
import upc.condominio.util.ConexionBD;
import etm.excepcion.DAOExcepcion;

public class PagoCuotaDAO extends BaseDAO {

	public PagoCuota insertar(PagoCuota pago) throws DAOExcepcion {
		String query = "insert into PagoCuota(idCuota,TipoPago,FechaPago,Importe) values (?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, pago.getCuota().getIdCuota());
			stmt.setString(2, pago.getTipoPago());
			stmt.setDate(3, pago.getFechaPago());			
			stmt.setDouble(4, pago.getImporte());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			// Obtener el ultimo id
			int id = 0;
			query = "select last_insert_id()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				id = rs.getInt(1);
			}
			pago.setIdPagoCuota(id);

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return pago;
	}

	public PagoCuota obtener(int idPagoCuota) throws DAOExcepcion {
		PagoCuota pago = new PagoCuota();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select idPagoCuota,idCuota,TipoPago,FechaPago,Importe from PagoCuota where idPagoCuota=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idPagoCuota);
			rs = stmt.executeQuery();
			if (rs.next()) {
				pago.setIdPagoCuota(rs.getInt("idPagoCuota"));
				RegistroCuotasDAO daoCuota = new RegistroCuotasDAO();
				pago.setCuota(daoCuota.obtener(rs.getInt("idCuota")));
				pago.setTipoPago(rs.getString("TipoPago"));
				pago.setFechaPago(rs.getDate("FechaPago"));
				pago.setImporte(rs.getDouble("Importe"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return pago;
	}

	public void eliminar(int idPago) throws DAOExcepcion {
		String query = "delete from PagoCuota WHERE idPagoCuota=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idPago);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}	

	public Collection<PagoCuota> listar(String atributo, String filtro) throws DAOExcepcion {
		Collection<PagoCuota> lista = new ArrayList<PagoCuota>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			if(filtro==null) filtro="";
			String query = "select idPagoCuota,P.idCuota,TipoPago,FechaPago,P.Importe from PagoCuota P "
							+ "inner join Cuota C on P.idCuota=C.idCuota "
							+ "inner join Residente R on C.idResidente=R.idResidente "
							+ "inner join Vivienda V on C.idVivienda=V.idVivienda "
							+ "where "+atributo+" like '"+filtro+"%' order by idPagoCuota desc";
			stmt = con.prepareStatement(query);					
			rs = stmt.executeQuery();
			while (rs.next()) {
				PagoCuota pago = new PagoCuota();
				pago.setIdPagoCuota(rs.getInt("idPagoCuota"));
				RegistroCuotasDAO daoCuota = new RegistroCuotasDAO();
				pago.setCuota(daoCuota.obtener(rs.getInt("idCuota")));
				pago.setTipoPago(rs.getString("TipoPago"));
				pago.setFechaPago(rs.getDate("FechaPago"));
				pago.setImporte(rs.getDouble("Importe"));				
				
				lista.add(pago);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}
}
